package com.ccjt.efcfs.cal;

import com.ccjt.efcfs.dto.LoanInfo;
import com.ccjt.efcfs.dto.RepayPlanCal;
import com.ccjt.efcfs.util.DateUtils;
import com.ccjt.efcfs.util.DecimalUtils;

import java.math.BigDecimal;
import java.math.RoundingMode;

import static com.ccjt.efcfs.constant.CalculateConstant.CAL_PRECISION;
import static com.ccjt.efcfs.constant.CalculateConstant.Decimal.BD_ONE;

/**
 * 等额本息
 * 概念：等额本息的意思是，每月的本金+利息之和相等（其实每个月本金和利息都有变化，并不相等）
 * 公式：分期应还本息=〔贷款本金×月利率×(1＋月利率)＾还款月数〕÷〔(1＋月利率)＾还款月数-1〕
 */
public class EqualCapitalPlusInterestCalculate extends CalculateBase {

    public EqualCapitalPlusInterestCalculate(LoanInfo loan) {
        super(loan);
    }

    @Override
    protected void calRepayPrincipal(RepayPlanCal plan) {
        BigDecimal repayTotal = calRepayTotal(plan);
        // 7. 应付本金
        // 7.1 本期计划周期应付本金
        plan.setMonthPerRepayPrincipal(DecimalUtils.sub(repayTotal, plan.getMonthPerRepayInterest()));
        // 7.2 本期计划周期金融日应付本金
        plan.setFinancePerRepayPrincipal(DecimalUtils.sub(repayTotal, plan.getFinancePerRepayInterest()));
        // 7.3 本期周期自然日应付本金
        plan.setNaturePerRepayPrincipal(DecimalUtils.sub(repayTotal, plan.getNaturePerRepayInterest()));
        // 7.4 本期实际自然日应付本金
//        System.out.println(plan.getBeginDate().before(loan.getEarlyRepayDate()));
//        System.out.println(loan.getEarlyRepayDate().before(plan.getEndDate()));
//        System.out.println(loan.getEarlyRepayTotal());
        if (loan.getEarlyRepayTotal() != null && loan.getEarlyRepayDate() != null && plan.getBeginDate().before(loan.getEarlyRepayDate()) && loan.getEarlyRepayDate().before(plan.getEndDate())) {
            plan.setActualPerRepayPrincipal(DecimalUtils.sub(loan.getEarlyRepayTotal(), plan.getActualPerRepayInterest()));
            plan.setPlanPeriods(plan.getPlanPeriods().add(BD_ONE));
        } else {
            plan.setActualPerRepayPrincipal(DecimalUtils.sub(repayTotal, plan.getActualPerRepayInterest()));
        }
    }

    protected BigDecimal calRepayTotal(RepayPlanCal plan) {
        /**
         * 计算本期本息合计，(等额本息)固定不变
         * 本息之和：〔贷款本金*月利率*(1+月利率)^还款月数〕/〔(1+月利率)^还款月数-1〕
         */
        BigDecimal tempCal = loan.getCalRate().add(BigDecimal.ONE).pow(loan.getPlanPeriods().intValue()); // 临时算式：(1＋月利率)＾还款月数
        return loan.getLoanPrincipal() // 贷款本金
                .multiply(loan.getMonthRate()) // *月利率
                .multiply(tempCal) // *临时算式
                .divide(tempCal.subtract(BigDecimal.ONE), CAL_PRECISION, RoundingMode.HALF_DOWN); // /〔临时算式-1〕
    }
}
